放后台的Linux任务没有了,试试这个命令
前两天有个新来的“小同事”问我,他有个任务下班前跑起来了,预计跑一夜就能完成了,第二天正好看结果,但是,等他第二天上班以后发现程序在他下班以后并没有运行,这是为什么呢?经过询问,他使用了&操作符。
&误区
提到把任务放到后台运行,有些小伙伴肯定第一印象是“&”操作符。
没错,“&”操作符确实可以直接将任务丢到后台执行,前台无需等待。你可以继续在当前终端继续执行其他命令。但这仅仅是当前终端模式的后台,即这个后台任务依然和当前的终端有着千丝万缕的关系,我们来看。
# 第一个终端:把任务放到当前终端的后台
[root@m01 ~]# sh test_nohup.sh &
[1] 1548
[root@m01 ~]# begin test nohup
[root@m01 ~]# echo $BASHPID # 查看当前的终端进程号
1298
# 第二个终端:再开一个终端
[root@m01 ~]# nohup sh test_nohup.sh &
[1] 1557
[root@m01 ~]# nohup: ignoring input and appending output to ‘nohup.out’
[root@m01 ~]# echo $BASHPID # 查看当前的终端进程号
1456
# 此时我们再开第三个终端,查看当前进程情况:
[root@m01 ~]# ps aux | grep test_nohup.sh
root 1548 0.0 0.1 113288 1196 pts/1 S 22:20 0:00 sh test_nohup.sh
root 1557 0.0 0.1 113288 1196 pts/2 S 22:20 0:00 sh test_nohup.sh
root 1561 0.0 0.1 112812 996 pts/3 R+ 22:20 0:00 grep --color=auto test_nohup.sh
在第三个终端看一下当前的进程树结构:
[root@m01 ~]# ps aux | grep test_nohup.sh
root 1548 0.0 0.1 113288 1196 pts/1 S 22:20 0:00 sh test_nohup.sh
root 1557 0.0 0.1 113288 1196 pts/2 S 22:20 0:00 sh test_nohup.sh
root 1561 0.0 0.1 112812 996 pts/3 R+ 22:20 0:00 grep --color=auto test_nohup.sh
我们会发现,虽然关闭了终端,但是,程序还在跑。
接下来我们关闭第一个终端,然后在第三个终端再次查看:
[root@m01 ~]# ps aux | grep test_nohup.sh
root 1557 0.0 0.1 113288 1196 pts/2 S 22:20 0:00 sh test_nohup.sh
root 1561 0.0 0.1 112812 996 pts/3 R+ 22:20 0:00 grep --color=auto test_nohup.sh
我们会发现bashid为1296的第一个终端关闭以后,任务对应的1548没有了,说明程序不再跑了。
小结:&只是把任务放到当前终端的后台,依据当前终端生存,终端关闭了,那么任务也就关闭了。
如果想实现终端关闭后任务依旧可以跑,那就需要nohup。
nohup
nohup 英文全称 no hang up(不挂起),用于在系统后台不中断地运行命令,退出终端不会影响程序的运行。这个命令会使程序忽略 HUP 信号,保证程序能够正常进行。(HUP 信号是在终端被中止的时候向它所关联的进程所发出的信号,进程收到这个信号后就会中止运行。)所以如果不希望进程被这个信号干掉的话,就可以忽略这个信号。而 nohup 命令做的就是这个事情。
上面实验我们也看到了,nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下。
语法格式:
[root@studyclub ~]# nohup [命令与参数] <==在当前终端前台中工作
[root@studyclub ~]# nohup [命令与参数] & <==在当前终端后台中工作
我们来看几个示例:
使用nohup命令后台启动一个程序
[root@studyclub ~]# nohup ./job.sh &
[1] 10174
[root@studyclub ~]# nohup: ignoring input and appending output to ‘nohup.out’ # 提示输出信息的保存位置
[root@studyclub ~]# jobs -l
[1]+ 18250 Running nohup ./job.sh & # jobs已经有了
# 接下来我们退出当前终端
[root@studyclub ~]# logout
# 重新登录linux,并查看jobs
[root@studyclub ~]# ps aux | grep job
root 18250 49.5 0.1 113180 1196 ? R 16:37 0:44 /bin/bash ./job.sh # 之前提交的任务还在
使用nohup同时运行多个程序
上面的示例都是启动一个程序,如果需要同时跑多个程序,我们可以这样做:
[root@studyclub ~]# nohup sh 'cp files testfile && ping 8.8.8.8 && sleep5'
ps aux | grep test_nohup.sh
然后:
kill -9 PID
kill -9 1557
Linux 网络状态工具 ss 命令详解
万字好文,最全 VxLAN 知识详解
Linux 的磁盘 I/O 性能监测
除每周二、四、六定期更新的《Linux云计算一站式教程》以外,其余时间雷哥会推送一些工作中遇到的小知识、实战经验总结的文章。后续都会收录在“实战经验”合集中。
拉到最下方,给我“发消息”
点个在看你最好看